﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestorDocument.DAL;
using GestorDocument.Model;
using GestorDocument.Model.IRepository;
using System.Collections.ObjectModel;
using GestorDocument.ViewModel.PantallaInicio;

namespace GestorDocument.ViewModel
{
    public class AsuntoViewModel : ViewModelBase
    {
        #region ROL Y USUARIO
        public RolModel Rol
        {
            get { return _Rol; }
            set
            {
                if (_Rol != value)
                {
                    _Rol = value;
                    OnPropertyChanged(RolPropertyName);
                }
            }
        }
        private RolModel _Rol;
        public const string RolPropertyName = "Rol";

        public UsuarioModel Usuario
        {
            get { return _Usuario; }
            set
            {
                if (_Usuario != value)
                {
                    _Usuario = value;
                    OnPropertyChanged(UsuarioPropertyName);
                }
            }
        }
        private UsuarioModel _Usuario;
        public const string UsuarioPropertyName = "Usuario";

        #endregion

        // ***************************** ***************************** *****************************
        // Repository.
        private IAsunto _AsuntoRepository;
        public PantallaInicioViewModel _PantallaInicioViewModel;
        public int _Filtro;
        public int _FiltroVencidos;
        public int _FiltroAtendidos;
        public int _FiltroPorVencer;
        public int _FiltroTodos;
        public int _FiltroBorrador;

        public string TituloGrid
        {
            get { return _TituloGrid; }
            set
            {
                if (_TituloGrid != value)
                {
                    _TituloGrid = value;
                    OnPropertyChanged(TituloGridPropertyName);
                }
            }
        }
        private string _TituloGrid;
        public const string TituloGridPropertyName = "TituloGrid";

        public string BackgroundTitulo
        {
            get { return _BackgroundTitulo; }
            set
            {
                if (_BackgroundTitulo != value)
                {
                    _BackgroundTitulo = value;
                    OnPropertyChanged(BackgroundTituloPropertyName);
                }
            }
        }
        private string _BackgroundTitulo;
        public const string BackgroundTituloPropertyName = "BackgroundTitulo";

        public AsuntoModel SelectedAsunto
        {
            get { return _SelectedAsunto; }
            set
            {
                if (_SelectedAsunto != value)
                {
                    _SelectedAsunto = value;
                    OnPropertyChanged(SelectedAsuntoPropertyName);
                }
            }
        }
        private AsuntoModel _SelectedAsunto;
        public const string SelectedAsuntoPropertyName = "SelectedAsunto";

        public TurnoModel SelectedTurno
        {
            get { return _SelectedTurno; }
            set
            {
                if (_SelectedTurno != value)
                {
                    _SelectedTurno = value;
                    OnPropertyChanged(SelectedTurnoPropertyName);
                }
            }
        }
        private TurnoModel _SelectedTurno;
        public const string SelectedTurnoPropertyName = "SelectedTurno";

        public BusquedaViewModel Busqueda
        {
            get { return _Busqueda; }
            set
            {
                if (_Busqueda != value)
                {
                    _Busqueda = value;
                    OnPropertyChanged(BusquedaPropertyName);
                }
            }
        }
        private BusquedaViewModel _Busqueda;
        public const string BusquedaPropertyName = "Busqueda";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid.
        public ObservableCollection<AsuntoModel> Asuntos
        {
            get { return _Asuntos; }
            set
            {
                if (_Asuntos != value)
                {
                    _Asuntos = value;
                    OnPropertyChanged(AsuntosPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _Asuntos;
        public const string AsuntosPropertyName = "Asuntos";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid.
        public ObservableCollection<TurnoModel> Turnos
        {
            get { return _Turnos; }
            set
            {
                if (_Turnos != value)
                {
                    _Turnos = value;
                    OnPropertyChanged(TurnoPropertyName);
                }
            }
        }
        private ObservableCollection<TurnoModel> _Turnos;
        public const string TurnoPropertyName = "Turnos";

        
        // ***************************** ***************************** *****************************
        // ELiminar.
        public RelayCommand DeleteCommand
        {
            get
            {
                if (_DeleteCommand == null)
                {
                    _DeleteCommand = new RelayCommand(p => this.AttemptDelete(), p => this.CanDelete());
                }

                return _DeleteCommand;
            }

        }
        private RelayCommand _DeleteCommand;
        public bool CanDelete()
        {
            bool _CanDelete = false;

            foreach (AsuntoModel p in this.Asuntos)
            {
                if (p.IsChecked)
                {
                    _CanDelete = true;
                    break;

                }
            }

            return _CanDelete;
        }
        public void AttemptDelete()
        {
            //TODO : Delete to database
            List<AsuntoModel> DeleteItem = null;
            try
            {
                DeleteItem = (from o in this.Asuntos
                              where o.IsChecked == true
                              select o).ToList();
            }
            catch (Exception)
            {
            }

            this._AsuntoRepository.DeleteAsunto(DeleteItem);
            this.LoadInfoGrid();
        }

        // ***************************** ***************************** *****************************
        // DESTINATARIOS
        private IDestinatario _DestinatarioRepository;


        // ***************************** ***************************** *****************************
        // Constructor y carga de elementos.
        public AsuntoViewModel()
        {
            this._AsuntoRepository = new GestorDocument.DAL.Repository.AsuntoRepository();
            this.LoadInfoGrid();
        }

        public AsuntoViewModel(PantallaInicioViewModel pantallaInicioViewModel, int filtro)
        {
            this._PantallaInicioViewModel = pantallaInicioViewModel;
            this._Rol = _PantallaInicioViewModel.Usuario.Rol;
            this._Filtro = filtro;
            this._AsuntoRepository = new GestorDocument.DAL.Repository.AsuntoRepository();
            this.Busqueda = new BusquedaViewModel(this._Rol);
            this._DestinatarioRepository = new GestorDocument.DAL.Repository.DestinatarioRepository();
            this.LoadInfoGrid();
        }
        
        public void LoadInfoGrid()
        {
            this.Asuntos = new ObservableCollection<AsuntoModel>();

            //VENCIDOS
            if (this._Filtro == 1)
            {
                this._FiltroVencidos = _Filtro;
                this.Asuntos = this._PantallaInicioViewModel.AsuntosVencidos;
                this.TituloGrid = "ASUNTOS VENCIDOS";
                this.BackgroundTitulo = "#FE2E2E";

            }
            //ATENDIDOS
            if (this._Filtro == 2)
            {
                this._FiltroAtendidos = _Filtro;
                this.Asuntos = this._PantallaInicioViewModel.AtendidosAsuntos;
                this.TituloGrid = "ASUNTOS ATENDIDOS";
                this.BackgroundTitulo = "#088A08";
            }
            //POR VENCER
            if (this._Filtro == 3)
            {
                this._FiltroPorVencer = _Filtro;
                this.Asuntos = this._PantallaInicioViewModel.AsuntosPorVencer;
                this.TituloGrid = "ASUNTOS POR VECER";
                this.BackgroundTitulo = "#FF8000";
            }

            //TODOS
            if (this._Filtro == 4)
            {
                this._FiltroTodos = _Filtro;
                this.Asuntos = this._PantallaInicioViewModel.TodosAsuntos;
                this.TituloGrid = "TOTAL DE ASUNTOS RECIBIDOS";
                this.BackgroundTitulo = "#01A9DB";
            }

            //BORRADOR
            if (this._Filtro == 5)
            {
                this._FiltroBorrador = _Filtro;
                this.Asuntos = this._PantallaInicioViewModel.BorradorAsuntos;
                this.TituloGrid = "ASUNTOS EN BORRADOR";
                this.BackgroundTitulo = "#0040FF";
            }

            

            (from p in this.Asuntos
             select p).ToList().ForEach(o => o.Turno.Destinatario = this._DestinatarioRepository.GetSeguimientoDestinatarios(o.IdAsunto));
        }

        public void LoadInfoGridBusqueda()
        {
            this.Asuntos = new ObservableCollection<AsuntoModel>();

            if (this.Busqueda.ResultadoBusqueda.Count !=0)
            {
                this.Asuntos = this.Busqueda.ResultadoBusqueda;

                (from p in this.Asuntos
                 select p).ToList().ForEach(o => o.Turno.Destinatario = this._DestinatarioRepository.GetSeguimientoDestinatarios(o.IdAsunto));

                this.TituloGrid = "RESULTADOS DE LA BUSQUEDA DE ASUNTOS";
                this.BackgroundTitulo = "#AC58FA";
            }
            else
            {
                this.TituloGrid = " SIN RESULTADO DE LA BUSQUEDA DE ASUNTOS";
                this.BackgroundTitulo = "#AC58FA";
            }
        }

    }
}
